package top.ochiamalu.aioj.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import top.ochiamalu.aioj.domain.dto.question.AddQuestionDTO;
import top.ochiamalu.aioj.domain.dto.question.GenerateDTO;
import top.ochiamalu.aioj.domain.dto.question.PageQuestionDTO;
import top.ochiamalu.aioj.domain.dto.question.UpdateQuestionDTO;
import top.ochiamalu.aioj.domain.entity.Question;
import top.ochiamalu.aioj.domain.vo.question.GenerateVO;
import top.ochiamalu.aioj.domain.vo.question.HotQuestionVO;
import top.ochiamalu.aioj.domain.vo.question.QuestionListVO;
import top.ochiamalu.aioj.domain.vo.question.QuestionVO;
import top.ochiamalu.aioj.domain.vo.question.RecentAcceptVO;
import top.ochiamalu.aioj.domain.vo.question.RecentUpdateQuestionVO;
import top.ochiamalu.aioj.domain.vo.question.SolveHistoryVO;
import top.ochiamalu.aioj.domain.vo.question.UpdateQuestionVO;

import java.util.List;

/**
 * 题目服务
 *
 * @author OchiaMalu
 * @date 2025/01/24
 */
public interface QuestionService extends IService<Question> {

    /**
     * 列出题目
     *
     * @return {@link List }<{@link QuestionListVO }>
     */
    List<QuestionListVO> listQuestions();

    /**
     * 添加题目
     *
     * @param addQuestionDTO 添加题目到
     * @return {@link Long }
     */
    Long addQuestion(AddQuestionDTO addQuestionDTO);

    /**
     * 通过id得到题目
     *
     * @param id 身份证件
     * @return {@link QuestionVO }
     */
    QuestionVO getQuestionById(Long id);

    /**
     * 分页题目
     *
     * @param pageQuestionDTO 页面题目到
     * @return {@link Page }<{@link QuestionListVO }>
     */
    Page<QuestionListVO> pageQuestions(PageQuestionDTO pageQuestionDTO);

    /**
     * 通过id得到题目细节
     *
     * @param id 身份证件
     * @return {@link UpdateQuestionVO }
     */
    UpdateQuestionVO getQuestionDetailById(Long id);

    /**
     * 更新题目
     *
     * @param updateQuestionDTO 更新题目到
     * @return boolean
     */
    boolean updateQuestion(UpdateQuestionDTO updateQuestionDTO);

    /**
     * 获得总分
     *
     * @return {@link Long }
     */
    Integer getTotalScore(Long id);

    /**
     * 列出热门问题
     *
     * @return {@link List }<{@link HotQuestionVO }>
     */
    List<HotQuestionVO> listHotQuestions();

    /**
     * 列出最近更新问题
     *
     * @return {@link List }<{@link RecentUpdateQuestionVO }>
     */
    List<RecentUpdateQuestionVO> listRecentUpdateQuestions();

    /**
     * 删除题目
     *
     * @param id ID
     * @return boolean
     */
    boolean deleteQuestion(Long id);

    /**
     * 列出最近通过问题
     *
     * @return {@link List }<{@link RecentAcceptVO }>
     */
    List<RecentAcceptVO> listRecentAcceptQuestions(String account);

    /**
     * 解决历史
     *
     * @param account 账户
     * @return {@link SolveHistoryVO }
     */
    SolveHistoryVO getSolveHistory(String account);

    /**
     * 计数困难
     *
     * @return {@link Integer }
     */
    Long countHard();

    /**
     * 计数中等
     *
     * @return {@link Integer }
     */
    Long countMedium();

    /**
     * 计数简单
     *
     * @return {@link Integer }
     */
    Long countEasy();

    /**
     * 生成
     *
     * @param generateDTO dto
     * @return {@link GenerateVO }
     */
    GenerateVO generate(GenerateDTO generateDTO);
}
